package reflect;

import reflect.annotations.AutoRunClass;
import reflect.annotations.AutoRunMethod;

import java.io.File;
import java.lang.reflect.Method;
import java.net.URISyntaxException;

/**
 * 调用与当前类Test5所在同一个包中被注解@AutoRunClass标注的类中那些被注解@AutoRunMethod标注的方法
 */
public class Test5 {
    public static void main(String[] args) throws Exception {
        /*
            1先通过Test5类定位它所在的目录
            2获取该目录中所有的.class文件，并根据文件名称解析出来
            3对每个类逐一加载类对象
            4首先根据类对象判断该类是否被注解
         */
        String packageName=Test4.class.getPackage().getName();
        File dir=new File(Test4.class.getResource(".").toURI());
        File[] subs=dir.listFiles(f->f.getName().endsWith(".class"));
        for(File sub:subs){
            String line=sub.getName();
            String className=line.substring(0,line.indexOf("."));
            Class cls=Class.forName(packageName+"."+className);
            boolean tf1=cls.isAnnotationPresent(AutoRunClass.class);
            if(tf1){
                System.out.println(className+":被标注了");
                Object obj=cls.newInstance();
                Method[] methods=cls.getDeclaredMethods();
                for(Method method:methods){
                    boolean tf2=method.isAnnotationPresent(AutoRunMethod.class);
                    if(tf2){
                        method.invoke(obj);
                    }
                }

            }
        }
    }
}
